package dice.sinanya.tools.log;

import dice.sinanya.entity.EntityLogText;
import dice.sinanya.entity.EntityTypeMessages;
import dice.sinanya.entity.imal.LogType;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static dice.sinanya.tools.getinfo.GetNickName.getNickName;
import static dice.sinanya.tools.makedata.FullWidth2halfWidth.fullWidth2halfWidth;

/**
 * @author SitaNya
 * 日期: 2019-06-15
 * 电子邮箱: sitanya@qq.com
 * 维护群(QQ): 162279609
 * 有任何问题欢迎咨询
 * 类说明: 日志信息规整类
 */
public class MakeLogInfo {

    static Pattern at = Pattern.compile(".*?\\[[cC][qQ]:at,qq=(\\d+?)].*");
    static Pattern speakTag = Pattern.compile("[“”\"]");
    static Pattern diceTag = Pattern.compile("^[ ]*[.。,，]");

    private MakeLogInfo() {
        throw new IllegalStateException("Utility class");
    }

    /**
     * 规整输入的单条日志信息，规整后的结果存入数据库
     *
     * @param info 单条日志信息
     * @return 规整后的单条日志信息
     */
    public static EntityLogText makeLogInfoByOutPut(String nick, String info) {
        EntityLogText entityLogText = new EntityLogText();

        entityLogText.setNick(nick);

        switch (checkLogType(info)) {
            case ACTION:
                entityLogText.setLogType(LogType.ACTION);
                entityLogText.setText(action(nick, info));
                break;
            case DICE:
                entityLogText.setLogType(LogType.DICE);
                break;
            case HIDE:
                entityLogText.setLogType(LogType.HIDE);
                entityLogText.setText(hide(nick, info));
                break;
            default:
                entityLogText.setLogType(LogType.SPEAK);
                entityLogText.setText(speak(nick, info));
        }
        return entityLogText;
    }

    /**
     * 规整输入的单条日志信息，规整后的结果存入数据库
     *
     * @param entityTypeMessages 消息封装类
     * @param info               单条日志信息
     * @return 规整后的单条日志信息
     */
    public static EntityLogText makeLogInfo(EntityTypeMessages entityTypeMessages, String info) {
        EntityLogText entityLogText = new EntityLogText();

        String nick = "[" + getNickName(entityTypeMessages) + "]";

        Matcher hasAt = at.matcher(info);
        while (hasAt.find()) {
            info = info.replaceFirst("\\[[cC][qQ]:at,qq=\\d+?]", "[" + getNickName(Long.parseLong(hasAt.group(1)), entityTypeMessages) + "]");
        }

        entityLogText.setNick(nick);

        entityLogText.setLogType(checkLogType(info));
        entityLogText.setText(info);
        return entityLogText;
    }

    /**
     * 规整化骰娘的结果信息
     *
     * @param info 骰娘录入的骰点信息
     * @return 规整化后的信息
     */
    public static EntityLogText makeLogInfoDice(String info) {
        EntityLogText entityLogText = new EntityLogText();
        info = info.trim();
//        如果包含"暗骰结果"或"日志"字样则不录入日志
        if (info.contains("暗骰结果") || info.contains("日志")) {
            return null;
        }

        entityLogText.setLogType(LogType.DICE);
        entityLogText.setText(info);
        entityLogText.setNick("骰娘");
        return entityLogText;
    }

    private static LogType checkLogType(String info) {
        info = fullWidth2halfWidth(info.trim());
        Matcher isDice = diceTag.matcher(info);
        if (info.startsWith("#")) {
            return LogType.ACTION;
        } else if (info.startsWith("(") && (info.endsWith(")") || !info.contains(")"))) {
            return LogType.HIDE;
        } else if (isDice.find()) {
            return LogType.DICE;
        } else {
            return LogType.SPEAK;
        }
    }

    private static String action(String nick, String info) {
        return nick + "\t发起行动\t" + info.replaceFirst("^#", "").trim();
    }

    private static String hide(String nick, String info) {
        info = info.replaceFirst("^[(（]", "");
        info = info.replaceFirst("[)）]$", "");
        return "(" + nick + ":\t" + info + ")";
    }

    private static String speak(String nick, String info) {
        Matcher isSpark = speakTag.matcher(info);
        if (isSpark.find()) {
            return nick + ":\t" + info;
        } else {
            return nick + ":\t\"" + info + "\"";
        }
    }
}
